
package JavaDemo;

/**
 * @作者 Administrator
 * @创建日期2015-4-12
 * @版本 java静态代码块以及非静态代码块.
 */
public class StaticDemo {

	public StaticDemo()
	{
		System.out.println(2);
	}
	
	/**
	 * java中的自由块分为静态的自由块和非静态的自由块，这两种的执行是有区别的。
	 * 非静态自由块的执行时间是：在执行构造函数之前执行。
	 * 静态自由块的执行时间是：class文件加载时执行。
	 * 执行的时间不同，造成的结果是：非静态自由块可以多次执行，只要初始化一个对象就会执行，但是静态自由块。
	 * 每次初始化一个对象，都会导致一次非静态块的执行。如果涉及到继承关系，则是：首先执行父类的非静态块，然后是父类的构造函数，接着是自己的自由块，最后是自己的构造函数。
	 * 静态块的执行时机是在class文件装载的时候，由于class文件只会装载一次，因此静态块只会执行一次，后面再使用这个类时，不会再执行静态块中的代码。 
	 * 更 细致的分析class装载的过程，其实静态块的执行时机是在class装载后的初始化阶段。如果采用ClassLoader的loadclass来仅仅装 载类而不初始化，是不会触发静态块的执行的。
	 * 采用Class的forname（String）是采用了默认的initialize为true的情况，也就 是初始化了。
	 * 如果使用forname（String name，boolean initialize， ClassLoader loader），设置initialize为false，同样不会执行静态块。
	 * 在执行class装载后的初始化阶段包括：运行<clinit>方法，这个方法中就是类变量的初始化语句和静态自由块语句。这个方法是由java的编译器收集信息后生成的，不能显示的调用。
	 * */
	
	
	/*静态代码块只会在类装载的时候执行一次，一般用来初始化类的静态变量的值*/
	static {
		System.out.println("静态代码块");
	}
	/*非静态代码块可以多次执行，只要初始化一个对象就会执行,在执行构造函数之前执行*/
	{
		System.out.println("非静态代码块");
	}
	
	@SuppressWarnings("unused")
	public static void main(String[] args) {		
		StaticDemo innerStatic =new StaticDemo();
		StaticDemo outerStatic =new StaticDemo();
	}

}
